package utils;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 *Description:
 *Version:1.0.0
 *@author shihb
 *@date 2020/5/25 11:57
 */
public class HttpUtil {
  /**
   * 请求类型： GET
   */
  public final static String GET = "GET";
  /**
   * 请求类型： POST
   */
  public final static String POST = "POST";

  /**
   * 模拟Http Get请求
   * @param urlStr
   *             请求路径
   * @param paramMap
   *             请求参数
   * @return
   * @throws Exception
   */
  public static String get(String urlStr, Map<String, String> paramMap) throws Exception{
    urlStr = urlStr + "?" + getParamString(paramMap);
    HttpURLConnection conn = null;
    try{
      //创建URL对象
      URL url = new URL(urlStr);
      //获取URL连接
      conn = (HttpURLConnection) url.openConnection();
      //设置通用的请求属性
      setHttpUrlConnection(conn, GET);
      //建立实际的连接
      conn.connect();
      //获取响应的内容
      return readResponseContent(conn.getInputStream());
    }finally{
      if(null!=conn) {
        conn.disconnect();
      }
    }
  }

  /**
   * 模拟Http Post请求
   * @param urlStr
   *             请求路径
   * @param paramMap
   *             请求参数
   * @return
   * @throws Exception
   */
  public static String post(String urlStr, Map<String, String> paramMap) throws Exception{
    HttpURLConnection conn = null;
    PrintWriter writer = null;
    try{
      //创建URL对象
      URL url = new URL(urlStr);
      //获取请求参数
      String param = getParamString(paramMap);
      System.out.println(param);
      //获取URL连接
      conn = (HttpURLConnection) url.openConnection();
      //设置通用请求属性
      setHttpUrlConnection(conn, POST);
      //建立实际的连接
      conn.connect();
      //将请求参数写入请求字符流中
      writer = new PrintWriter(conn.getOutputStream());
      writer.print(param);
      writer.flush();
      //读取响应的内容
      return readResponseContent(conn.getInputStream());
    }finally{
      if(null!=conn) {
        conn.disconnect();
      }
      if(null!=writer) {
        writer.close();
      }
    }
  }

  /**
   * 读取响应字节流并将之转为字符串
   * @param in
   *         要读取的字节流
   * @return
   * @throws IOException
   */
  private static String readResponseContent(InputStream in) throws IOException {
    Reader reader = null;
    StringBuilder content = new StringBuilder();
    try{
      reader = new InputStreamReader(in);
      char[] buffer = new char[1024];
      int head = 0;
      while( (head=reader.read(buffer))>0 ){
        content.append(new String(buffer, 0, head));
      }
      return content.toString();
    }finally{
      if(null!=in) {
        in.close();
      }
      if(null!=reader) {
        reader.close();
      }
    }
  }

  /**
   * 设置Http连接属性
   * @param conn
   *             http连接
   * @return
   * @throws ProtocolException
   * @throws Exception
   */
  private static void setHttpUrlConnection(HttpURLConnection conn, String requestMethod) throws Exception{
    conn.setRequestMethod(requestMethod);
    conn.setRequestProperty("accept", "*/*");
    conn.setRequestProperty("Accept-Language", "zh-CN");
    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
    conn.setRequestProperty("Proxy-Connection", "Keep-Alive");
    if(null!=requestMethod && POST.equals(requestMethod)){
      conn.setDoOutput(true);
      conn.setDoInput(true);
    }
  }

  /**
   * 将参数转为路径字符串
   * @param paramMap
   *             参数
   * @return
   */
  private static String getParamString(Map<String, String> paramMap){
    if(null==paramMap || paramMap.isEmpty()){
      return "";
    }
    StringBuilder builder = new StringBuilder();
    for(String key : paramMap.keySet() ){
      builder.append("&")
          .append(key).append("=").append(paramMap.get(key));
    }
    return builder.deleteCharAt(0).toString();
  }

  public static void main(String[] args) throws Exception {
    HashMap<String, String> map = new HashMap<>(5);
    map.put("test","test");
    System.out.println(post("http://192.168.0.61/sdc", map));

  }

}
